home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1998 May / Macworld (1998-05).dmg / Serious Demos / TeamWave 3.0 / TeamWave Workplace / TeamWave Workplace.rsrc / TEXT_14_tkerror.txt < prev    next >
Text File  |  1998-02-13  |  3KB  |  100 lines

  1. # bgerror.tcl --
  2. #
  3. # This file contains a default version of the bgerror procedure.  It
  4. # posts a dialog box with the error message and gives the user a chance
  5. # to see a more detailed stack trace.
  6. #
  7. # SCCS: @(#) bgerror.tcl 1.16 97/08/06 09:19:50
  8. #
  9. # Copyright (c) 1992-1994 The Regents of the University of California.
  10. # Copyright (c) 1994-1996 Sun Microsystems, Inc.
  11. #
  12. # See the file "license.terms" for information on usage and redistribution
  13. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  14.  
  15.  
  16. # bgerror --
  17. # This is the default version of bgerror. 
  18. # It tries to execute tkerror, if that fails it posts a dialog box containing
  19. # the error message and gives the user a chance to ask to see a stack
  20. # trace.
  21. # Arguments:
  22. # err -            The error message.
  23.  
  24. proc bgerror err {
  25.     global errorInfo tcl_platform
  26.  
  27.     # save errorInfo which would be erased in the catch below otherwise.
  28.     set info $errorInfo ;
  29.  
  30.     # For backward compatibility :
  31.     # Let's try to execute "tkerror" (using catch {tkerror ...} 
  32.     # instead of searching it with info procs so the application gets
  33.     # a chance to auto load it using its favorite "unknown" mecanism.
  34.     # (we do the default dialog only if we get a TCL_ERROR (=1) return
  35.     #  code from the tkerror trial, other ret codes are passed back
  36.     #  to our caller (tcl background error handler) so the called "tkerror"
  37.     #  can still use  return -code break, to skip remaining messages
  38.     #  in the error queue for instance)  -- dl
  39.     set ret [catch {tkerror $err} msg];
  40.     if {$ret != 1} {return -code $ret $msg}
  41.  
  42.     # Ok the application's tkerror either failed or was not found
  43.     # we use the default dialog then :
  44.     if {$tcl_platform(platform) == "macintosh"} {
  45.     set ok Ok
  46.     } else {
  47.     set ok OK
  48.     }
  49.     set button [tk_dialog .bgerrorDialog "Error in Tcl Script" \
  50.         "Error: $err" error 0 $ok "Skip Messages" "Stack Trace"]
  51.     if {$button == 0} {
  52.     return
  53.     } elseif {$button == 1} {
  54.     return -code break
  55.     }
  56.  
  57.     set w .bgerrorTrace
  58.     catch {destroy $w}
  59.     toplevel $w -class ErrorTrace
  60.     wm minsize $w 1 1
  61.     wm title $w "Stack Trace for Error"
  62.     wm iconname $w "Stack Trace"
  63.     button $w.ok -text OK -command "destroy $w" -default active
  64.     if {$tcl_platform(platform) == "macintosh"} {
  65.       text $w.text -relief flat -bd 2 -highlightthickness 0 -setgrid true \
  66.         -yscrollcommand "$w.scroll set" -width 60 -height 20
  67.     } else {
  68.       text $w.text -relief sunken -bd 2 -yscrollcommand "$w.scroll set" \
  69.         -setgrid true -width 60 -height 20
  70.     }
  71.     scrollbar $w.scroll -relief sunken -command "$w.text yview"
  72.     pack $w.ok -side bottom -padx 3m -pady 2m
  73.     pack $w.scroll -side right -fill y
  74.     pack $w.text -side left -expand yes -fill both
  75.     $w.text insert 0.0 $info
  76.     $w.text mark set insert 0.0
  77.  
  78.     bind $w <Return> "destroy $w"
  79.     bind $w.text <Return> "destroy $w; break"
  80.  
  81.     # Center the window on the screen.
  82.  
  83.     wm withdraw $w
  84.     update idletasks
  85.     set x [expr [winfo screenwidth $w]/2 - [winfo reqwidth $w]/2 \
  86.         - [winfo vrootx [winfo parent $w]]]
  87.     set y [expr [winfo screenheight $w]/2 - [winfo reqheight $w]/2 \
  88.         - [winfo vrooty [winfo parent $w]]]
  89.     wm geom $w +$x+$y
  90.     wm deiconify $w
  91.  
  92.     # Be sure to release any grabs that might be present on the
  93.     # screen, since they could make it impossible for the user
  94.     # to interact with the stack trace.
  95.  
  96.     if {[grab current .] != ""} {
  97.     grab release [grab current .]
  98.     }
  99. }
  100.